/*
 * Copyright (c)  2015~2020, xforceplus
 * All rights reserved.
 * Project:datacare-orm
 * Id: InsertSqlManager.java   2020-10-10 23-33-00
 * Author: Evan
 */
package cn.datacare.orm.manager;

import cn.datacare.orm.database.KeyHolder;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * Title:
 * </p>
 * <p>
 * Description:
 * </p>
 * <p>
 * Copyright: 2015~2020
 * </p>
 * <p>
 * Company/Department: xforceplus
 * </p>
 *
 * @author Evan
 * <b>Creation Time:</b> 2020-10-10 23-33-00
 * @since V1.0
 */
public interface InsertSqlManager {

    /**
     * 通用插入操作
     * @param obj
     * @return int insert rows
     */
    int insert(Object obj);

    /**
     * 插入实体
     * @param obj 实体类
     * @param autoKey 是否自动从数据库获取主键值, 自增或者序列
     * @return int 插入行数
     */
    int insert(Object obj, boolean autoKey);

    /**
     * 插入实体
     * @param clazz
     * @param paras
     * @param autoKey
     * @return  插入行数
     */
    int insert(Class<?> clazz, Object paras, boolean autoKey);

    /**
     * 按模板插入数据
     * @param obj Object
     * @return  插入行数
     */
    int insertTemplate(Object obj);

    /**
     * 模板插入，并根据autoAssignKey 自动获取自增主键值
     * @param params
     * @param autoKey
     * @return int 插入行数
     */
    int insertTemplate(Object params, boolean autoKey);

    /**
     * 模板插入，并根据autoAssignKey 自动获取自增主键值
     * @param clazz
     * @param params
     * @param autoKey
     * @return int 插入行数
     */
    int insertTemplate(Class clazz, Object params, boolean autoKey);

    /**
     * 插入对象通用的方法，如果数据表有自增主键，需要获取到自增主键，参考使用 insert(Object paras,boolean
     * @param clazz
     * @param paras
     * @return  插入行数
     */
    int insert(Class<?> clazz, Object paras);


    /**
     *
     * @param clazz
     * @param paras
     * @param autoKey
     * @param template
     * @return
     */
    int generalInsert(Class clazz, Object paras, boolean autoKey, boolean template);


    /**
     * 批量保存
     * @param clazz
     * @param list
     * @return 插入行数
     */
    int[] insertBatch(Class<?> clazz, List<?> list);

    /**
     * 批量保存数据
     * @param clazz
     * @param list
     * @param autoKey
     * @return 插入行数
     */
    int[] insertBatch(Class<?> clazz, List<?> list,boolean  autoKey);

    /**
     * 插入，并获取自增主键的值
     * @param clazz
     * @param obj
     * @param holder 自增或者序列主健放到holder对象里
     * @return 插入行数
     */
    int insert(Class<?> clazz, Object obj, KeyHolder holder);

    /**
     * 模板插入，仅仅插入非空属性，并获取自增主键
     * @param clazz
     * @param obj
     * @param holder
     * @return 插入行
     */
    int insertTemplate(Class<?> clazz, Object obj, KeyHolder holder);

    /**
     * 插入，并获取主键
     * @param sqlId
     * @param paras
     * @param holder
     * @param keyName
     * @return 插入影响行数
     */
    int insert(String sqlId, Object paras, KeyHolder holder, String keyName);

    /**
     * 插入，并获取主键,主键将通过paras所代表的表名来获取
     * @param sqlId
     * @param obj
     * @param keyHolder
     * @return 插入行数
     */
    int insert(String sqlId, Object obj, KeyHolder keyHolder);

    /**
     *  插入操作，数据库自增主键放到keyHolder里
     * @param sqlId
     * @param clazz
     * @param params
     * @param holder
     * @return int 插入影响行数
     */
    int insert(String sqlId, Class<?> clazz, Map<String,Object> params, KeyHolder holder);

    /**
     * 插入，并获取自增主键值，因为此接口并未指定实体对象，因此需要keyName来指明数据库主键列
     * @param sqlId
     * @param params
     * @param keyHolder  KeyHolder
     * @param keyName 主键列名称
     * @return int 插入行数
     */
    int insert(String sqlId, Map<String,Object> params, KeyHolder keyHolder, String keyName);

}
